home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / editor / gdsntxrs.lha / Assembly_Parser / asm.parser.asm < prev    next >
Assembly Source File  |  1995-05-31  |  6KB  |  295 lines

  1. ; asm.parser - GoldED syntax parser for assembly sources
  2. ;
  3. ; © 1995 by Leon Woestenberg (leon@stack.urc.tue.nl). Freeware.
  4. ;
  5. ; Assembled using the PhxAss shareware macro assembler by Frank Wille.
  6. ;
  7. ; GoldED is copyrighted by Dietmar Eilert.
  8.  
  9.   NOLIST
  10.   ; system includes
  11.   INCLUDE exec/initializers.i
  12.   INCLUDE exec/resident.i
  13.   INCLUDE exec/libraries.i
  14.   INCLUDE exec_lib.i
  15.  
  16.   ; golded includes
  17.   INCLUDE GOLDED:API/include/golded.i
  18.   INCLUDE GOLDED:Syntax/Developer/include/scanlib.i
  19.  
  20.   ; revision include
  21.   INCLUDE asm.parser_rev.i
  22.   LIST
  23.  
  24.   ; asmbase structure
  25.   STRUCTURE asmbase,PB_SIZE
  26.     ULONG asmbase_seglist
  27.     ULONG asmbase_execbase
  28.     LABEL asmbase_SIZE
  29.  
  30. ; fail when run as executable
  31. first_address:
  32.   moveq #-1,d0
  33.   rts
  34.  
  35. ; romtag (resident) structure
  36. romtag:
  37.   dc.w RTC_MATCHWORD
  38.   dc.l romtag
  39.   dc.l endcode
  40.   dc.b RTF_AUTOINIT
  41.   dc.b VERSION
  42.   dc.b NT_LIBRARY
  43.   dc.b 0
  44.   dc.l libraryname
  45.   dc.l idstring
  46.   dc.l inittable
  47.  
  48. ; we are RTF_AUTOINIT, so we present an init table
  49.   EVEN
  50. inittable:
  51.   dc.l asmbase_SIZE
  52.   dc.l functable
  53.   dc.l datatable
  54.   dc.l initroutine
  55. functable:
  56. ; absolute pointers to device standard routines
  57.   dc.l Open
  58.   dc.l Close
  59.   dc.l Expunge
  60.   dc.l Null
  61. ; absolute pointers to infraface device i/o entries
  62.   dc.l MountScanner
  63.   dc.l StartScanner
  64.   dc.l CloseScanner
  65.   dc.l FlushScanner
  66.   dc.l SetupScanner
  67.   dc.l BriefScanner
  68.   dc.l ParseLine
  69.   dc.l UnparseLines
  70.   dc.l ParseSection
  71. ; function table end marker
  72.   dc.l -1
  73. datatable:
  74. ; initializes our library structure
  75. ; second argument to MakeLibrary
  76.   INITBYTE LN_TYPE,NT_LIBRARY
  77.   INITLONG LN_NAME,libraryname
  78.   INITBYTE LIB_FLAGS,LIBF_SUMUSED ! LIBF_CHANGED
  79.   INITWORD LIB_VERSION,VERSION
  80.   INITWORD LIB_REVISION,REVISION
  81.   INITLONG LIB_IDSTRING,idstring
  82.   INITLONG PB_MAGIC,PARSER_MAGIC
  83.   dc.l 0
  84. initroutine:
  85.   ; { d0 = asmbase }
  86.   ; { a0 = seglist }
  87.   ; { a6 = execbase }
  88.   exg d0,a0
  89.   move.l d0,(asmbase_seglist,a0)
  90.   move.l a6,(asmbase_execbase,a0)
  91.   exg d0,a0
  92.   ; { d0 = asmbase }
  93.   rts
  94.  
  95. Open:
  96.   ; { d0 = version }
  97.   ; { a6 = asmbase }
  98.   ; we have another opener
  99.   addq.w #1,(LIB_OPENCNT,a6)
  100.   ; prevent delayed expunges
  101.   bclr.b #LIBB_DELEXP,(LIB_FLAGS,a6)
  102.   ; return asmbase
  103.   move.l a6,d0
  104.   rts
  105.  
  106. Close:
  107.   ; set return value
  108.   moveq #0,d0
  109.   ; we lost one opener
  110.   subq.w #1,(LIB_OPENCNT,a6)
  111.   ; { Z = no openers }
  112.   bne .end
  113.   ; delayed expunge pending?
  114.   btst.b #LIBB_DELEXP,(LIB_FLAGS,a6)
  115.   ; { Z = no delayed expunge pending }
  116.   beq .noexpunge
  117.   bsr Expunge
  118. .noexpunge:
  119. .end:
  120.   rts
  121.  
  122. Expunge:
  123.   ;{ a6 = asmbase }
  124.   movem.l d2/a5/a6,-(sp)
  125.   movea.l a6,a5
  126.   ;{ a5 = asmbase }
  127.   movea.l (asmbase_execbase,a5),a6
  128.   ;{ a6 = execbase }
  129.   tst.w (LIB_OPENCNT,a5)
  130.   ; if zero users, expunge now
  131.   beq .expungenow
  132.   ;{ at least one user left }
  133.   ; pend a delayed expunge and return 0
  134.   bset.b #LIBB_DELEXP,(LIB_FLAGS,a5)
  135.   moveq #0,d0
  136.   bra .end
  137. .expungenow:
  138.   ;{ no users left }
  139.   ; copy seglist into d2
  140.   move.l (asmbase_seglist,a5),d2
  141.   ;{ d2 = pointer to our seglist }
  142.   movea.l a5,a1
  143.   ;{ a1 = asmbase }
  144.   ; remove library from list
  145.   jsr (_LVORemove,a6)
  146.   ;{ we are no longer in the library list }
  147.   movea.l a5,a1
  148.   ;{ a1 = asmbase }
  149.   moveq #0,d0
  150.   move.w (LIB_NEGSIZE,a5),d0
  151.   ;{ d0 = #bytes before library pointer }
  152.   suba.l d0,a1
  153.   ;{ a1 = first byte of our library }
  154.   add.w (LIB_POSSIZE,a5),d0
  155.   ;{ d0 = #bytes used by library }
  156.   jsr (_LVOFreeMem,a6)
  157.   ;{ d2 = pointer to our seglist }
  158.   move.l d2,d0
  159.   ;{ library no longer open }
  160.   ;{ d0 = pointer to our seglist }
  161. .end:
  162.   movem.l (sp)+,d2/a5/a6
  163.   rts
  164.  
  165. Null:
  166.   moveq #0,d0
  167.   rts
  168.  
  169. MountScanner:
  170.   lea (parserdata,pc),a0
  171.   move.l a0,d0
  172.   ;{ a0 = parserdata }
  173.   rts
  174. StartScanner:
  175.   ;{ d0 = syntaxstack }
  176.   rts
  177. CloseScanner:
  178. FlushScanner:
  179. SetupScanner:
  180. BriefScanner:
  181.   moveq #0,d0
  182.   rts
  183. ParseLine:
  184.   bchg.b #1,$bfe001
  185.   ;{ d0 = scanid }
  186.   ;{ a0 = linenode }
  187.   ;{ d1 = line }
  188.   tst.l (LINENODE_FOLD,a0)
  189.   bne .folded
  190.   move.w (LINENODE_LEN,a0),d1
  191. LENGTH EQUR d1
  192.   ;{ d1 = length }
  193.   beq .zerolength
  194.   move.l (LINENODE_TEXT,a0),a1
  195. TEXT EQUR a1
  196.   ;{ a1 = text }
  197. .leading:
  198.   cmpi.b #' ',(TEXT)
  199.   bne .trailing
  200.   adda.l #1,TEXT
  201.   subi.w #1,LENGTH
  202.   beq .nothingleft
  203.   bra .leading
  204.  
  205. .trailing:
  206.   ; check last character against space
  207.   cmpi.b #' ',(-1,TEXT,LENGTH)
  208.   ; if no space then proceed
  209.   bne .asterix
  210.   ; decrease length
  211.   subi.w #1,LENGTH
  212.   ; if zero length then leave
  213.   beq .nothingleft
  214.   ; check next last character
  215.   bra .trailing
  216.  
  217.   ; asterix as first character makes rest comment
  218. .asterix:
  219.   ;{ a1 = text (trimmed) }
  220.   ;{ d1 = length (trimmed) }
  221.   cmpi.b #'*',(TEXT)
  222.   beq .gotone
  223.   ; anything after semicolon is comment
  224. .semicolon:
  225.   cmpi.b #';',(TEXT)
  226.   beq .gotone
  227.   adda.l #1,TEXT
  228.   subi.w #1,LENGTH
  229.   beq .nothingleft
  230.   bra .semicolon
  231. .gotone:
  232.   ;{ a0 = linenode }
  233.   suba.l (LINENODE_TEXT,a0),TEXT
  234.   ;{ a1 = start }
  235.   movea.l d0,a0
  236.   ;{ a0 = syntax stack }
  237.   ;{ TEXT = start column }
  238.   move.w TEXT,(SC_START,a0)
  239.   add.l TEXT,LENGTH
  240.   subq #1,LENGTH
  241.   ;{ LENGTH = end column }
  242.   move.w LENGTH,(SC_END,a0)
  243.   move.w #1,(SC_LEVEL,a0)
  244.   move.l #0,(SYNTAXCHUNK_SIZE,a0)
  245.   move.w #0,(SYNTAXCHUNK_SIZE+SC_LEVEL,a0)
  246.   ;{ d0 = syntax stack }
  247.   bra .end
  248. .nocomment:
  249. .nothingleft:
  250. .zerolength:
  251. .folded:
  252.   moveq #0,d0
  253. .end:
  254.   rts
  255.  
  256. UnparseLines:
  257.   rts
  258. ParseSection:
  259.   rts
  260.  
  261. libraryname:
  262.   dc.b 'asm.parser',0
  263. idstring:
  264.   VSTRING
  265.  
  266.   EVEN
  267. parserdata:
  268.   dc.l SCANLIBVERSION
  269.   dc.l VERSION
  270.   dc.l 0 ;*** REVISION should be here, but GoldED rejects it then ?! ***
  271.   dc.l info
  272.   dc.w 2
  273.   dc.l namelist
  274.   dc.l colorlist
  275.   dc.w 0
  276.   dc.l 0
  277. info:
  278.   dc.b 'Assembly Parser',0
  279.   EVEN
  280. namelist:
  281.   dc.l standard
  282.   dc.l comment
  283.   dc.l 0
  284. standard:
  285.   dc.b 'Standard',0
  286. comment:
  287.   dc.b 'Comment ( ;bla bla )',0
  288.   EVEN
  289. colorlist:
  290.   dc.l $000
  291.   dc.l $fff
  292.   dc.l 0
  293. endcode:
  294.  
  295.